﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmFacturacion : Form
    {

        private DataTable dtFacturas;
        private DataTable dtEmpresa;
        private Validador valida = new Validador();

        private GLOBuscador buscador;

        private double precioProdActual = 0.0;

        public FrmFacturacion()
        {
            InitializeComponent();
        }

        #region Eventos Controles


        private void FrmOrdenCompra_Load(object sender, EventArgs e)
        {

            if (cbClienteGen.Checked)
            {
                txtCedula.Text = "";
                txtCliente.Text = "CLIENTE";
                txtDireccion.Text = "";
            }
            else
            {
            }

            cargarDatosEmpresa();

        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                POSDTFactura detalle = new POSDTFactura(0, int.Parse(txtCodigo.Text)
                    , int.Parse(txtCantidad.Text), double.Parse(txtPrecioUnitario.Text.Replace(".", ",")));
                dgvDTFactura.Rows.Add(detalle.Cantidad, txtCodigo.Text
                    , txtNombreProd.Text
                    , detalle.PrecioUnitario, detalle.Cantidad * detalle.PrecioUnitario);
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
            catch (Exception ex)
            {
                GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto\n\n Mensaje técnico del error: " + ex.Message, "Exception");
                error.ShowDialog();
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            try
            {
                try
                {
                    dgvDTFactura.Rows.Remove(dgvDTFactura.SelectedRows[0]);
                    calcularSubTotal();
                    calcularDescuento();
                    calcularImpuesto();
                    calcularTotal();
                }
                catch (ArgumentOutOfRangeException) { }
            }
            catch (ArgumentOutOfRangeException) { }
        }


        private void cbIVI_CheckedChanged(object sender, EventArgs e)
        {
            if (!cbIVI.Checked)
            {
                txtIVI.Text = "0,0";
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
            else
            {
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
        }

        private void lstOrdenesCompra_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarFacturaElegida();
        }

        private void rbContado_CheckedChanged(object sender, EventArgs e)
        {
            if (rbContado.Checked)
            {
                lblEncabezado.Text = "Factura de contado";
            }
        }

        private void rbCredito_CheckedChanged(object sender, EventArgs e)
        {
            if (rbCredito.Checked)
            {
                lblEncabezado.Text = "Factura a crédito";
            }
        }

        private void txtCodigo_TextChanged(object sender, EventArgs e)
        {
            cargarInfoProducto(txtCodigo.Text, false);
        }

        private void cbClienteGen_CheckedChanged(object sender, EventArgs e)
        {
            if (cbClienteGen.Checked)
            {
                txtCedula.Text = "";
                txtCliente.Text = "CLIENTE";
                txtDireccion.Text = "";
            }
            else
            {
                abrirBuscadorCliente();
            }
        }

        private void txtDescuento_TextChanged(object sender, EventArgs e)
        {
            calcularSubTotal();
            calcularDescuento();
            calcularImpuesto();
            calcularTotal();
        }

        private void cbDescuento_CheckedChanged(object sender, EventArgs e)
        {
            if (!cbDescuento.Checked)
            {
                txtDescuento.Text = "0,0";
                txtDescuentoCalcu.Text = "0,0";
            }
            else
            {
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
        }

        private void mcFecha_DateChanged(object sender, DateRangeEventArgs e)
        {
            pnlFacturaAnulada.Visible = false;
        }

        #endregion

        #region Eventos Botones NGEC

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            dtFacturas = new DataTable();
            habilitar();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                int TipoCompra = 0;
                if (rbContado.Checked)
                {
                    TipoCompra = (int)SCMOrdenCompra.TipoCompras.Contado;
                }
                else if (rbCredito.Checked)
                {
                    TipoCompra = (int)SCMOrdenCompra.TipoCompras.Credito;
                }

                int IVI = 0;
                if (cbIVI.Checked)
                {
                    IVI = (int)POSFactura.IVIs.ConImpuesto;
                }
                else
                {
                    IVI = (int)POSFactura.IVIs.SinImpuesto;
                }

                int Entregado = 0;
                if (cbEntregado.Checked)
                {
                    Entregado = (int)SCMOrdenCompra.Entregados.Entregado;
                }
                else
                {
                    Entregado = (int)SCMOrdenCompra.Entregados.NoEntregado;
                }

                double Descuento;
                if (cbDescuento.Checked)
                {
                    Descuento = double.Parse(txtDescuento.Text);
                    if ((Descuento < 0.0) || (Descuento > 100))
                    {
                        throw new FormatException("El descuento debe estar entre 0 y 100");
                    }
                }
                else
                {
                    Descuento = 0.0;
                }

                int IdCliente = -1;
                try
                {
                    if (!cbClienteGen.Checked)
                    {
                        IdCliente = int.Parse(Cache.faccliente.Cells[0].Value.ToString());
                    }
                }
                catch (Exception) { }

                DataTable Detalle = new DataTable("11DTFACTURA");
                DataColumn columna = new DataColumn("IdProducto");
                columna.DataType = System.Type.GetType("System.Int32");
                Detalle.Columns.Add(columna);
                columna = new DataColumn("Cantidad");
                columna.DataType = System.Type.GetType("System.Int32");
                Detalle.Columns.Add(columna);
                columna = new DataColumn("PrecioUnitario");
                columna.DataType = System.Type.GetType("System.Double");
                Detalle.Columns.Add(columna);

                foreach (DataGridViewRow drv in dgvDTFactura.Rows)
                {
                    DataRow dr = Detalle.NewRow();
                    dr["IdProducto"] = int.Parse(drv.Cells[1].Value.ToString());
                    dr["Cantidad"] = int.Parse(drv.Cells[0].Value.ToString());
                    dr["PrecioUnitario"] = double.Parse(drv.Cells[3].Value.ToString());
                    Detalle.Rows.Add(dr);
                }

                DataRow drEmpresa = dtEmpresa.Rows[0];

                DateTime fecha = new DateTime(dtpFecha.Value.Year, dtpFecha.Value.Month, dtpFecha.Value.Day
                    , DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);

                POSFactura factura = new POSFactura(0, IdCliente, txtCedula.Text, txtCliente.Text, txtDireccion.Text, fecha
                    , TipoCompra, IVI, Entregado, Descuento, 0, drEmpresa["Nombre"].ToString()
                    , drEmpresa["NombreJuridico"].ToString(), drEmpresa["CedJuridica"].ToString(), Detalle);

                if (factura.insertar())
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha guardado la factura");
                    mensaje.ShowDialog();
                    //inhabilitar();
                    //cargarFacturaElegida();
                    btnNuevo.Enabled = true;
                    btnNuevo.PerformClick();
                }
                else
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                    error.ShowDialog();
                }

            }
            catch (NullReferenceException ne)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe ingresar productos en la factura que desea guardar.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
            catch (FormatException fe)
            {
                GLOMensajeError error = new GLOMensajeError("No se eligió un cliente.", "Si eligió descuento, ¿puso un valor de descuento entre 0 y 100?\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                error.ShowDialog();
            }
            catch (ValidadorException ve)
            {
                GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Debe incluir al menos un artículo en la factura.\n\n Mensaje técnico del error: " + ve.Message, "ValidadorException");
                error.ShowDialog();
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("ADVERTENCIA: Posible corrupción en los datos.\n\nUsted está por anular una factura. "
                + "El sistema permite anular en caso de haberlas facturado erróneamente. "
                + "Al anular esta factura el inventario aumentara, ya que no se dió la venta si los artículos no se devolvieron"
                + " el inventario tendrá valores por encima de la cantidad real a menos que vuelva a facturar bien esta compra"
                + "o agregue los artículos como consumo interno.\n\n"
                + "Si desea quitar la anulación de esta factura, deberá entrar a \"Facturas anuladas\" donde observará el número"
                + "de factura que deberá decirle al gerente del sistema para que la recupere.\n\n"
                + "¿Desea anular la factura?", "Anular Factura", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    //Vamos a anular órden...

                    DataRow dr = dtFacturas.Rows[0];
                    int Anulada = int.Parse(dr["Anulada"].ToString());
                    if (Anulada == 0)
                    {
                        POSFactura factura = new POSFactura();
                        factura.IdFactura = int.Parse(dr["IdFactura"].ToString());
                        if (factura.modificar())
                        {
                            GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha anulado la factura");
                            mensaje.ShowDialog();
                            //limpiar();
                            //cargarFacturaElegida();
                            btnCancelar.Enabled = true;
                            btnCancelar.PerformClick();
                        }
                    }
                    else
                    {
                        GLOMensajeAceptar mensaje = new GLOMensajeAceptar("La factura ya está anulada");
                        mensaje.ShowDialog();
                    }
                }
                catch (NullReferenceException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "No ha escogido la factura que desea anular.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
                catch (IndexOutOfRangeException ne)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "No ha escogido la factura que desea anular.\n\n Mensaje técnico del error: " + ne.Message, "IndexOutOfRangeException");
                    error.ShowDialog();
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            dtFacturas = new DataTable();
            inhabilitar();
            cargarFacturaElegida();
        }

        #endregion

        #region Carga de Datos

        private void cargarInfoProducto(string IdProducto, bool CodBarras)
        {
            try
            {
                txtNombreProd.Text = "";
                txtPrecioUnitario.Text = "";
                txtPrecioUnitario.ReadOnly = true;
                DataTable dt;
                if (CodBarras)
                {
                    dt = SCMProducto.consultarXCodigoBarras(IdProducto);
                }
                else
                {
                    dt = SCMProducto.consultarXID(int.Parse(IdProducto));
                }
                DataRow dr = dt.Rows[0];
                txtCodigo.Text = dr["IdProducto"].ToString();
                txtNombreProd.Text = dr["Nombre"].ToString();
                dt = SCMPrecioVenta.consultarPrecioVentaMAX(int.Parse(dr["IdProducto"].ToString()));
                dr = dt.Rows[0];
                precioProdActual = double.Parse(dr["PrecioVenta"].ToString());
                txtPrecioUnitario.Text = dr["PrecioVenta"].ToString();
            }
            catch (FormatException) { }
            catch (IndexOutOfRangeException) { }
            catch (NullReferenceException) { }
            if (valida.validarEsVacio(txtPrecioUnitario.Text))
            {
                txtPrecioUnitario.ReadOnly = true;
            }
            else
            {
                txtPrecioUnitario.ReadOnly = false;
            }
        }

        private void buscador_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtCedula.Text = Cache.faccliente.Cells[1].Value.ToString();
                txtCliente.Text = Cache.faccliente.Cells[2].Value.ToString() + " "
                    + Cache.faccliente.Cells[3].Value.ToString() + " "
                    + Cache.faccliente.Cells[4].Value.ToString();
                txtDireccion.Text = Cache.faccliente.Cells[5].Value.ToString();
            }
            catch (NullReferenceException) { }
        }

        private void buscadorFactura_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                dtFacturas = POSFactura.consultarXID(Convert.ToInt32(Cache.factura.Cells[0].Value.ToString()));
                cargarFacturaElegida();
            }
            catch (FormatException) { }
            catch (NullReferenceException) { }
            
        }

        private void cargarDatosEmpresa()
        {
            dtEmpresa = CONEmpresa.consultar();
            try
            {
                DataRow dr = dtEmpresa.Rows[0];
                if (!valida.validarEsVacio(dr["Nombre"].ToString()))
                {
                    lblNombreEmpr.Text = dr["Nombre"].ToString();
                }
                else
                {
                    lblNombreEmpr.Text = "";
                }
                if (!valida.validarEsVacio(dr["NombreJuridico"].ToString()))
                {
                    lblNombreJur.Text = dr["NombreJuridico"].ToString();
                }
                else
                {
                    lblNombreJur.Text = "";
                }
                if (!valida.validarEsVacio(dr["CedJuridica"].ToString()))
                {
                    lblCedJuridica.Text = dr["CedJuridica"].ToString();
                }
                else
                {
                    lblCedJuridica.Text = "";
                }
                if (!valida.validarEsVacio(dr["Telefono"].ToString()))
                {
                    lblTels.Text = "Tel: " + dr["Telefono"].ToString();
                }
                else
                {
                    lblTels.Text = "";
                }
                if (!valida.validarEsVacio(dr["Telefono2"].ToString()))
                {
                    lblTels.Text += ", " + dr["Telefono2"].ToString();
                }
                if (!valida.validarEsVacio(dr["Fax"].ToString()))
                {
                    lblTels.Text += ", Fax: " + dr["Fax"].ToString();
                }
            }
            catch (IndexOutOfRangeException)
            {
                if (CONEmpresa.insertar())
                {
                    cargarDatosEmpresa();
                }
                else
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                    error.ShowDialog();
                }
            }

        }

        private void cargarFacturaElegida()
        {
            try
            {

                DataRow dr = dtFacturas.Rows[0];
                int IdCliente = int.Parse(dr["IdCliente"].ToString());
                if (IdCliente == -1)
                {
                    cbClienteGen.Checked = true;
                }
                int Anulada = int.Parse(dr["Anulada"].ToString());
                if (Anulada == 1)
                {
                    pnlFacturaAnulada.Visible = true;
                }
                else
                {
                    pnlFacturaAnulada.Visible = false;
                }
                int TipoCompra = int.Parse(dr["TipoCompra"].ToString());
                if (TipoCompra == (int)POSFactura.TipoCompras.Contado)
                {
                    rbContado.Checked = true;
                }
                else
                {
                    rbCredito.Checked = true;
                }
                txtFacturaNum.Text = dr["IdFactura"].ToString();
                dtpFecha.Value = (DateTime)dr["Fecha"];
                dtEmpresa = CONEmpresa.consultar();
                DataRow dr2 = dtEmpresa.Rows[0];
                if (!valida.validarEsVacio(dr["NombreEmpr"].ToString()))
                {
                    lblNombreEmpr.Text = dr["NombreEmpr"].ToString();
                }
                else
                {
                    lblNombreEmpr.Text = "";
                }
                if (!valida.validarEsVacio(dr["NombreJurEmpr"].ToString()))
                {
                    lblNombreJur.Text = dr["NombreJurEmpr"].ToString();
                }
                else
                {
                    lblNombreJur.Text = "";
                }
                if (!valida.validarEsVacio(dr["CedJuridica"].ToString()))
                {
                    lblCedJuridica.Text = dr["CedJuridica"].ToString();
                }
                else
                {
                    lblCedJuridica.Text = "";
                }
                if (!valida.validarEsVacio(dr2["Telefono"].ToString()))
                {
                    lblTels.Text = "Tel: " + dr2["Telefono"].ToString();
                }
                else
                {
                    lblTels.Text = "";
                }
                if (!valida.validarEsVacio(dr2["Telefono2"].ToString()))
                {
                    lblTels.Text += ", " + dr2["Telefono2"].ToString();
                }
                if (!valida.validarEsVacio(dr2["Fax"].ToString()))
                {
                    lblTels.Text += ", Fax: " + dr2["Fax"].ToString();
                }

                txtCedula.Text = dr["Cedula"].ToString();
                txtCliente.Text = dr["NombreCliente"].ToString();
                txtDireccion.Text = dr["Direccion"].ToString();

                DataTable dt = POSDTFactura.consultar(int.Parse(dr["IdFactura"].ToString()));
                dgvDTFactura.Rows.Clear();
                foreach (DataRow dr3 in dt.Rows)
                {
                    dgvDTFactura.Rows.Add(dr3["Cantidad"].ToString(), dr3["IdProducto"].ToString(), dr3["Nombre"].ToString()
                        , dr3["PrecioUnitario"].ToString()
                        , int.Parse(dr3["Cantidad"].ToString()) * double.Parse(dr3["PrecioUnitario"].ToString()));
                }
                txtDescuento.Text = dr["Descuento"].ToString();
                int IVI = int.Parse(dr["IVI"].ToString());
                if (IVI != 1)
                {
                    cbIVI.Checked = true;
                }
                else
                {
                    cbIVI.Checked = false;
                }
                int Entregado = int.Parse(dr[7].ToString());
                if (Entregado == (int)POSFactura.Entregados.Entregado)
                {
                    cbEntregado.Checked = true;
                }
                else
                {
                    cbEntregado.Checked = false;
                }
                calcularSubTotal();
                calcularDescuento();
                calcularImpuestoFactura(int.Parse(dr["Impuesto"].ToString()));
                calcularTotal();
            }
            catch (NullReferenceException) { }
            catch (IndexOutOfRangeException) { }
        }

        #endregion

        #region Metodos

        private void habilitar()
        {

            //Encabezado
            cbClienteGen.Enabled = true;
            rbContado.Enabled = true;
            rbCredito.Enabled = true;
            dtpFecha.Enabled = true;
            btnBuscarCliente.Enabled = true;
            txtCedula.ReadOnly = false;
            txtCliente.ReadOnly = false;
            txtDireccion.ReadOnly = false;

            //Detalle
            txtCodigo.ReadOnly = false;
            txtCodBarras.ReadOnly = false;
            txtCantidad.ReadOnly = false;
            btnAgregar.Enabled = true;
            btnQuitar.Enabled = true;
            cbDescuento.Enabled = true;
            txtDescuento.ReadOnly = false;
            cbIVI.Enabled = true;
            cbEntregado.Enabled = true;

            //botones
            btnNuevo.Enabled = false;
            btnAnular.Enabled = false;
            btnGuardar.Enabled = true;
            btnCancelar.Enabled = true;
            btnBuscarFactura.Enabled = false;
            btnBuscarProd.Enabled = true;
            nudDescuento.Enabled = true;

            limpiar();
        }

        private void inhabilitar()
        {
            //Encabezado
            cbClienteGen.Enabled = false;
            rbContado.Enabled = false;
            rbCredito.Enabled = false;
            dtpFecha.Enabled = false;
            btnBuscarCliente.Enabled = true;
            txtCedula.ReadOnly = true;
            txtCliente.ReadOnly = true;
            txtDireccion.ReadOnly = true;

            //Detalle
            txtCodigo.ReadOnly = true;
            txtCodBarras.ReadOnly = true;
            txtCantidad.ReadOnly = true;
            txtPrecioUnitario.ReadOnly = true;
            btnAgregar.Enabled = false;
            btnQuitar.Enabled = false;
            cbDescuento.Enabled = false;
            txtDescuento.ReadOnly = true;
            cbIVI.Enabled = false;
            cbEntregado.Enabled = false;

            //botones
            btnNuevo.Enabled = true;
            btnAnular.Enabled = true;
            btnGuardar.Enabled = false;
            btnCancelar.Enabled = false;
            btnBuscarFactura.Enabled = true;
            btnBuscarProd.Enabled = false;
            btnBuscarCliente.Enabled = false;
            nudDescuento.Enabled = false;

            limpiar();
        }

        private void limpiar()
        {
            cbClienteGen.Checked = true;
            rbContado.Checked = true;
            dtpFecha.Value = DateTime.Now;
            txtFacturaNum.Text = "XXXXXX";

            cargarDatosEmpresa();

            txtCedula.Text = "";
            txtCliente.Text = "CLIENTE";
            txtDireccion.Text = "";

            dgvDTFactura.Rows.Clear();

            txtSubTotal.Text = "0,0";
            txtDescuento.Text = "0,0";
            txtDescuentoCalcu.Text = "0,0";
            txtIVI.Text = "0,0";
            txtPuntos.Text = "0,0";
            txtTotal.Text = "0,0";

            pnlFacturaAnulada.Visible = false;

            cbDescuento.Checked = true;
            cbIVI.Checked = true;
            cbEntregado.Checked = true;
        }

        private void calcularSubTotal()
        {
            double subtotal = 0.0;
            foreach (DataGridViewRow dr in dgvDTFactura.Rows)
            {
                subtotal += double.Parse(dr.Cells[4].Value.ToString());
            }
            txtSubTotal.Text = String.Format("{0:0.00}", subtotal);
        }

        private void calcularDescuento()
        {
            if (cbDescuento.Checked)
            {
                try
                {
                    txtDescuento.ForeColor = Color.Black;
                    txtDescuentoCalcu.Text = "0,0";
                    double subtotal = double.Parse(txtSubTotal.Text);
                    double desc = double.Parse(txtDescuento.Text);
                    txtDescuentoCalcu.Text = String.Format("{0:0.00}", (subtotal * desc) / 100);
                }
                catch (FormatException)
                {
                    txtDescuento.ForeColor = Color.Red;
                }
            }
        }

        private void calcularImpuesto()
        {
            if (cbIVI.Checked)
            {
                double subtotal = double.Parse(txtSubTotal.Text);
                double desc = double.Parse(txtDescuentoCalcu.Text);
                txtIVI.Text = String.Format("{0:0.00}", ((subtotal - desc) * Configuracion.impuestoVenta) / 100);
            }
        }

        private void calcularImpuestoFactura(int ImpuestoFactura)
        {
            if (cbIVI.Checked)
            {
                double subtotal = double.Parse(txtSubTotal.Text);
                double desc = double.Parse(txtDescuentoCalcu.Text);
                txtIVI.Text = String.Format("{0:0.00}", ((subtotal - desc) * ImpuestoFactura) / 100);
            }
        }

        private void calcularTotal()
        {
            double subtotal = double.Parse(txtSubTotal.Text);
            double impuesto = double.Parse(txtIVI.Text);
            double desc = double.Parse(txtDescuentoCalcu.Text);
            txtTotal.Text = String.Format("{0:0.00}", (subtotal - desc) + impuesto);
        }

        #endregion

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            cbClienteGen.Checked = false;
        }

        private void abrirBuscadorCliente()
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.FacCliente;
            buscador.FormClosed += new FormClosedEventHandler(buscador_Closed);
            buscador.ShowDialog();
        }

        private void abrirBuscadorFactura()
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.Factura;
            buscador.FormClosed += new FormClosedEventHandler(buscadorFactura_Closed);
            buscador.ShowDialog();
        }

        private void btnBuscarProd_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.FacProd;
            buscador.FormClosed += new FormClosedEventHandler(buscadorProd_Closed);
            buscador.ShowDialog();
        }

        private void buscadorProd_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                nudDescuento.Value = 0;
                txtCodigo.Text = Cache.facproducto.Cells[0].Value.ToString();
                cargarInfoProducto(txtCodigo.Text, false);
            }
            catch (NullReferenceException) { }
        }

        private void nudDescuento_ValueChanged(object sender, EventArgs e)
        {
            txtPrecioUnitario.Text = String.Format("{0:0.00}", precioProdActual - ((precioProdActual
                * Convert.ToDouble(nudDescuento.Value) / 100)));
        }

        private void txtCodBarras_TextChanged(object sender, EventArgs e)
        {
            cargarInfoProducto(txtCodBarras.Text, true);
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            pnlFacturaAnulada.Visible = false;
        }

        private void btnBuscarFactura_Click(object sender, EventArgs e)
        {
            abrirBuscadorFactura();
        }

    }
}
